1
Una transazione è una singola unità di lavoro
DSAI2202Transactions in SQL Databases
00:00

Le modifiche ai dati raramente arrivano da sole: un bonifico deve addebitare un conto e accreditare l'altro, e un ordine deve riservare scorte e registrare un pagamento. Se il sistema si interrompe a metà, il database finisce per descrivere un mondo che non è mai esistito. Una transazione è la risposta del database a questo problema — una sequenza di una o più operazioni che il database tratta come una singola e indivisibile unità di lavoro.

Tutto o niente

All'interno di una transazione, ogni operazione appartiene a un unico esito. Il database non espone mai uno stato finale in cui è avvenuta solo una parte della transazione. L'esempio classico è un bonifico tra due conti bancari: ridurre il saldo del conto di origine, poi aumentare il saldo del conto di destinazione. Se riuscisse solo il primo passo, il denaro svanirebbe; se riuscisse solo il secondo, il denaro comparirebbe dal nulla. Racchiudere entrambi i passi in una sola transazione elimina entrambe le possibilità.

Questa garanzia tutto-o-niente si chiama atomicità. Commit è l'atto che rende permanenti le modifiche della transazione; una transazione che non viene mai confermata non lascia alcuna traccia. Durabilità aggiunge il tassello finale: una volta che il commit è andato a buon fine, la modifica sopravvive anche se la macchina perde alimentazione un attimo dopo.

Una transazione è una singola unità di lavoroUna transazione è una singola unità di lavoroAtomicità: tutto o niente.Confine della transazioneuna singola unità di lavoroPasso 1 — Addebitare il conto di originePasso 2 — Accreditare il conto di destinazioneAll'interno del confine esistono stati intermedi,ma sono privati di questa transazione.✓COMMITEntrambe le modifiche permanentiSopravvive a un crash dopo il commit↺ROLLBACKNessuno dei due conti modificatoNon lascia alcuna tracciaUna transazione è una sequenza di una o più operazioni trattate come una singola e indivisibile unità di lavoro.

Una transazione è un confine

È utile immaginare una transazione come un confine tracciato attorno a un gruppo di istruzioni. Prima del confine e dopo di esso, i dati soddisfano le regole imposte dalla struttura. All'interno del confine esistono stati intermedi — un conto è già stato addebitato mentre l'altro non è ancora stato accreditato — ma questi stati sono privati della transazione. Le istruzioni successive in altre sessioni non li considerano come verità.

Due compiti insieme

Le transazioni svolgono quindi due compiti. Il primo è la gestione dei guasti: se il processo va in crash, la connessione cade o un'istruzione genera un errore, il database può ripristinare lo stato esistente prima dell'inizio della transazione. Il secondo è il controllo della visibilità: mentre il lavoro è in corso, gli altri lettori sono protetti dal risultato incompleto. Questi due compiti sono correlati ma non identici — l'atomicità decide se le modifiche vengono mantenute, mentre la visibilità è regolata dall'isolamento, l'impostazione che controlla quanto le transazioni concorrenti possono vedere l'una dell'altra.

Mantieni l'unità su una sola connessione
Lo stato della transazione appartiene a una connessione o sessione, quindi l'istruzione che apre la transazione e il commit che la conclude devono essere eseguiti sulla stessa connessione. Molti driver operano inoltre in modalità autocommit , in cui ogni singola istruzione è una transazione a sé — un'unità composta da più istruzioni richiede che l'autocommit sia disattivato o un avvio esplicito.